{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Embedding 与 变长输入实战IMDB文本分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.0.0\n",
      "sys.version_info(major=3, minor=6, micro=10, releaselevel='final', serial=0)\n",
      "matplotlib 3.1.2\n",
      "numpy 1.18.1\n",
      "pandas 0.25.3\n",
      "sklearn 0.22.1\n",
      "tensorflow 2.0.0\n",
      "tensorflow_core.keras 2.2.4-tf\n"
     ]
    }
   ],
   "source": [
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "import numpy as np\n",
    "import sklearn\n",
    "import pandas as pd\n",
    "import os\n",
    "import sys\n",
    "import time\n",
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "\n",
    "print(tf.__version__)\n",
    "print(sys.version_info)\n",
    "for module in mpl,np,pd,sklearn,tf,keras:\n",
    "    print(module.__name__,module.__version__)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def solve_cudnn_error():\n",
    "    gpus = tf.config.experimental.list_physical_devices('GPU')\n",
    "    if gpus:\n",
    "        try:\n",
    "            # Currently, memory growth needs to be the same across GPUs\n",
    "            for gpu in gpus:\n",
    "                tf.config.experimental.set_memory_growth(gpu, True)\n",
    "            logical_gpus = tf.config.experimental.list_logical_devices('GPU')\n",
    "            print(len(gpus), \"Physical GPUs,\", len(logical_gpus), \"Logical GPUs\")\n",
    "        except RuntimeError as e:\n",
    "            # Memory growth must be set before GPUs have been initialized\n",
    "            print(e)\n",
    "\n",
    "solve_cudnn_error()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 数据读取"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据集载入\n",
    "imdb = keras.datasets.imdb\n",
    "# 词表大小\n",
    "vocab_size = 10000\n",
    "# 从索引多少时构建\n",
    "index_from = 3\n",
    "(train_data, train_labels), (test_data, test_labels) = imdb.load_data(\n",
    "    num_words = vocab_size, index_from = index_from)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据集探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32] 1\n",
      "(25000,) (25000,)\n",
      "218 189\n"
     ]
    }
   ],
   "source": [
    "print(train_data[0], train_labels[0])\n",
    "print(train_data.shape, train_labels.shape)\n",
    "print(len(train_data[0]), len(train_data[1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(25000,) (25000,)\n"
     ]
    }
   ],
   "source": [
    "print(test_data.shape, test_labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 构建词表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "88584\n"
     ]
    }
   ],
   "source": [
    "# 载入词表\n",
    "word_index = imdb.get_word_index()\n",
    "print(len(word_index))\n",
    "# print(word_index)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 索引从3开始，所以词表全部偏移3\n",
    "word_index = {k : (v + 3) for k, v in word_index.items()}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 添加必要的特殊字符\n",
    "word_index['<PAD>'] = 0 # padding填充\n",
    "word_index['<START>'] = 1 # 开始\n",
    "word_index['<UNK>'] = 2 # 找不到时填补\n",
    "word_index['<EOS>'] = 3 # 结束\n",
    "\n",
    "# 构建倒排索引：id到词的索引\n",
    "reverse_word_index = dict([(value, key) for key, value in word_index.items()])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "\"<START> this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert <UNK> is an amazing actor and now the same being director <UNK> father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for <UNK> and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also <UNK> to the two little boy's that played the <UNK> of norman and paul they were just brilliant children are often left out of the <UNK> list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all\""
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看train_data具体文本\n",
    "def decode_review(text_ids):\n",
    "    return ' '.join(\n",
    "        [reverse_word_index.get(word_id, '<UNK>') for word_id in text_ids])\n",
    "\n",
    "decode_review(train_data[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 变长输入处理--Padding和截断"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[   1   14   22   16   43  530  973 1622 1385   65  458 4468   66 3941\n",
      "    4  173   36  256    5   25  100   43  838  112   50  670    2    9\n",
      "   35  480  284    5  150    4  172  112  167    2  336  385   39    4\n",
      "  172 4536 1111   17  546   38   13  447    4  192   50   16    6  147\n",
      " 2025   19   14   22    4 1920 4613  469    4   22   71   87   12   16\n",
      "   43  530   38   76   15   13 1247    4   22   17  515   17   12   16\n",
      "  626   18    2    5   62  386   12    8  316    8  106    5    4 2223\n",
      " 5244   16  480   66 3785   33    4  130   12   16   38  619    5   25\n",
      "  124   51   36  135   48   25 1415   33    6   22   12  215   28   77\n",
      "   52    5   14  407   16   82    2    8    4  107  117 5952   15  256\n",
      "    4    2    7 3766    5  723   36   71   43  530  476   26  400  317\n",
      "   46    7    4    2 1029   13  104   88    4  381   15  297   98   32\n",
      " 2071   56   26  141    6  194 7486   18    4  226   22   21  134  476\n",
      "   26  480    5  144   30 5535   18   51   36   28  224   92   25  104\n",
      "    4  226   65   16   38 1334   88   12   16  283    5   16 4472  113\n",
      "  103   32   15   16 5345   19  178   32    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0    0    0    0    0\n",
      "    0    0    0    0    0    0    0    0    0    0]\n"
     ]
    }
   ],
   "source": [
    "# padding\n",
    "max_length = 500\n",
    "\n",
    "train_data = keras.preprocessing.sequence.pad_sequences(\n",
    "    train_data, value = word_index['<PAD>'], padding = 'post', maxlen = max_length)\n",
    "\n",
    "test_data = keras.preprocessing.sequence.pad_sequences(\n",
    "    test_data, value = word_index['<PAD>'], padding = 'post', maxlen = max_length)\n",
    "\n",
    "print(train_data[0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 模型构建\n",
    "\n",
    "Embedding层所做的事情：\n",
    "1. 构建一个矩阵define matrix：[vocab_size, embedding_dim]\n",
    "2. 对于每个句子中的索引[1,2,3,4..]，从上述矩阵中查得该索引对应的向量，每个样本变为max_length * embedding_dim 长度的矩阵\n",
    "3. 对于每个batch，输出数据的长度为batch_size * max_length * embedding_dim\n",
    "\n",
    "GlobalAveragePooling层：做合并\n",
    "- 将batch_size * max_length * embedding_dim 变为 batch_size * embedding_dim 的矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "embedding (Embedding)        (None, 500, 16)           160000    \n",
      "_________________________________________________________________\n",
      "global_average_pooling1d (Gl (None, 16)                0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 64)                1088      \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 1)                 65        \n",
      "=================================================================\n",
      "Total params: 161,153\n",
      "Trainable params: 161,153\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "embedding_dim = 16 # 每个词Embedding成长度为16的向量\n",
    "batch_size = 128\n",
    "\n",
    "model = keras.models.Sequential([\n",
    "    keras.layers.Embedding(vocab_size, embedding_dim, input_length = max_length),\n",
    "    keras.layers.GlobalAveragePooling1D(),\n",
    "    keras.layers.Dense(64, activation = 'relu'),\n",
    "    keras.layers.Dense(1, activation = 'sigmoid'),\n",
    "])\n",
    "model.summary()\n",
    "model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 20000 samples, validate on 5000 samples\n",
      "Epoch 1/30\n",
      "20000/20000 [==============================] - 4s 193us/sample - loss: 0.6820 - accuracy: 0.6012 - val_loss: 0.6451 - val_accuracy: 0.7424\n",
      "Epoch 2/30\n",
      "20000/20000 [==============================] - 3s 133us/sample - loss: 0.5385 - accuracy: 0.8097 - val_loss: 0.4314 - val_accuracy: 0.8536\n",
      "Epoch 3/30\n",
      "20000/20000 [==============================] - 3s 136us/sample - loss: 0.3553 - accuracy: 0.8769 - val_loss: 0.3340 - val_accuracy: 0.8754\n",
      "Epoch 4/30\n",
      "20000/20000 [==============================] - 3s 132us/sample - loss: 0.2763 - accuracy: 0.8999 - val_loss: 0.3068 - val_accuracy: 0.8790\n",
      "Epoch 5/30\n",
      "20000/20000 [==============================] - 3s 130us/sample - loss: 0.2368 - accuracy: 0.9133 - val_loss: 0.2889 - val_accuracy: 0.8858\n",
      "Epoch 6/30\n",
      "20000/20000 [==============================] - 3s 130us/sample - loss: 0.2074 - accuracy: 0.9247 - val_loss: 0.2797 - val_accuracy: 0.8918\n",
      "Epoch 7/30\n",
      "20000/20000 [==============================] - 3s 131us/sample - loss: 0.1852 - accuracy: 0.9335 - val_loss: 0.2778 - val_accuracy: 0.8954\n",
      "Epoch 8/30\n",
      "20000/20000 [==============================] - 3s 133us/sample - loss: 0.1677 - accuracy: 0.9412 - val_loss: 0.2886 - val_accuracy: 0.8892\n",
      "Epoch 9/30\n",
      "20000/20000 [==============================] - 3s 142us/sample - loss: 0.1519 - accuracy: 0.9480 - val_loss: 0.2810 - val_accuracy: 0.8960\n",
      "Epoch 10/30\n",
      "20000/20000 [==============================] - 3s 150us/sample - loss: 0.1410 - accuracy: 0.9523 - val_loss: 0.2869 - val_accuracy: 0.8976\n",
      "Epoch 11/30\n",
      "20000/20000 [==============================] - 3s 131us/sample - loss: 0.1275 - accuracy: 0.9577 - val_loss: 0.2955 - val_accuracy: 0.8966\n",
      "Epoch 12/30\n",
      "20000/20000 [==============================] - 3s 132us/sample - loss: 0.1184 - accuracy: 0.9613 - val_loss: 0.3013 - val_accuracy: 0.8970\n",
      "Epoch 13/30\n",
      "20000/20000 [==============================] - 3s 130us/sample - loss: 0.1069 - accuracy: 0.9667 - val_loss: 0.3121 - val_accuracy: 0.8946\n",
      "Epoch 14/30\n",
      "20000/20000 [==============================] - 3s 134us/sample - loss: 0.0988 - accuracy: 0.9694 - val_loss: 0.3223 - val_accuracy: 0.8944\n",
      "Epoch 15/30\n",
      "20000/20000 [==============================] - 3s 132us/sample - loss: 0.0909 - accuracy: 0.9726 - val_loss: 0.3359 - val_accuracy: 0.8936\n",
      "Epoch 16/30\n",
      "20000/20000 [==============================] - 3s 132us/sample - loss: 0.0847 - accuracy: 0.9744 - val_loss: 0.3445 - val_accuracy: 0.8928\n",
      "Epoch 17/30\n",
      "20000/20000 [==============================] - 3s 144us/sample - loss: 0.0779 - accuracy: 0.9779 - val_loss: 0.3578 - val_accuracy: 0.8918\n",
      "Epoch 18/30\n",
      "20000/20000 [==============================] - 3s 136us/sample - loss: 0.0704 - accuracy: 0.9808 - val_loss: 0.3719 - val_accuracy: 0.8904\n",
      "Epoch 19/30\n",
      "20000/20000 [==============================] - 3s 137us/sample - loss: 0.0650 - accuracy: 0.9823 - val_loss: 0.3952 - val_accuracy: 0.8858\n",
      "Epoch 20/30\n",
      "20000/20000 [==============================] - 3s 131us/sample - loss: 0.0594 - accuracy: 0.9850 - val_loss: 0.4003 - val_accuracy: 0.8860\n",
      "Epoch 21/30\n",
      "20000/20000 [==============================] - 3s 131us/sample - loss: 0.0546 - accuracy: 0.9862 - val_loss: 0.4213 - val_accuracy: 0.8834\n",
      "Epoch 22/30\n",
      "20000/20000 [==============================] - 3s 131us/sample - loss: 0.0505 - accuracy: 0.9876 - val_loss: 0.4334 - val_accuracy: 0.8838\n",
      "Epoch 23/30\n",
      "20000/20000 [==============================] - 3s 130us/sample - loss: 0.0445 - accuracy: 0.9897 - val_loss: 0.4494 - val_accuracy: 0.8858\n",
      "Epoch 24/30\n",
      "20000/20000 [==============================] - 3s 133us/sample - loss: 0.0399 - accuracy: 0.9913 - val_loss: 0.4673 - val_accuracy: 0.8838\n",
      "Epoch 25/30\n",
      "20000/20000 [==============================] - 3s 127us/sample - loss: 0.0354 - accuracy: 0.9923 - val_loss: 0.4954 - val_accuracy: 0.8824\n",
      "Epoch 26/30\n",
      "20000/20000 [==============================] - 3s 133us/sample - loss: 0.0324 - accuracy: 0.9934 - val_loss: 0.5010 - val_accuracy: 0.8828\n",
      "Epoch 27/30\n",
      "20000/20000 [==============================] - 3s 136us/sample - loss: 0.0297 - accuracy: 0.9938 - val_loss: 0.5312 - val_accuracy: 0.8808\n",
      "Epoch 28/30\n",
      "20000/20000 [==============================] - 3s 132us/sample - loss: 0.0273 - accuracy: 0.9955 - val_loss: 0.5404 - val_accuracy: 0.8804\n",
      "Epoch 29/30\n",
      "20000/20000 [==============================] - 3s 130us/sample - loss: 0.0237 - accuracy: 0.9962 - val_loss: 0.5583 - val_accuracy: 0.8796\n",
      "Epoch 30/30\n",
      "20000/20000 [==============================] - 3s 133us/sample - loss: 0.0215 - accuracy: 0.9966 - val_loss: 0.5778 - val_accuracy: 0.8784\n"
     ]
    }
   ],
   "source": [
    "# 训练\n",
    "history = model.fit(train_data, train_labels, epochs = 30,\n",
    "                    batch_size = batch_size, validation_split = 0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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JyeePn26y+xO3rBhA6eeempOyuNn6bcQvfXWW5kzZw6f/exnB+Tcg+nfpKqqKjV8ID1TPWVPdZUd1VP2zGydc+7Mw3mPBjkHkblz51JUVMS9996b66KIiMgAUVAPIuvWrct1EUREZIBpjFpERMTHFNQiIiI+pqAWERHxMQW1iIiIjymoRUREfExBfRTSn5IlIiJyLCiojwN6trWIyPHLv7+j/p+vwgfr+/eYY2fCJd/rcfMdd9zB5MmT+eu//msA7rrrLsyMFStWcODAAaLRKHfffTeLFi3q81SNjY0sWrSo2/c98sgjfP/738fMmDVrFo8++ih79uzhlltuYcuWLQDcf//9jB8/nssuu4zVq1cD8P3vf5/GxkbuuusuKisrmT9/PitXruTyyy/n5JNP5u6776a9vZ3y8nIee+wxxowZQ2NjI1/4whdYu3YtZsa3vvUtDh48yFtvvcUPf/hDAH7+85+zYcMGfvCDHxxV9YqISP/zb1DnwOLFi/nSl76UCuonn3yS5557jttuu43hw4dTU1PD2WefzeWXX97t063SRSIRli9ffsj73nnnHb7zne+wcuVKRo4cmXrgxhe/+EXOP/98li9fTjwep7Gxsc/nWx88eJA//OEPgPdAkDVr1mBmPPDAA9xzzz3ce++93T4zOy8vj1mzZnHPPfcQDof55S9/yc9+9rOjrT4RETkG/BvUvbR8j5U5c+awd+9edu3axb59+ygrK2PcuHHcdtttrFixgkAgwM6dO9mzZw9jx47t9VjOOe68885D3vf73/+eq666ipEjRwKdz7b+/e9/n3q+dDAYpKSkpM+g7ng4CEB1dTWf+tSn2L17N+3t7alnZ/f0zOwLL7yQ3/72t5x66qlEo1Fmzpx5mLUlIiIDwb9BnSNXXXUVTz31FB988AGLFy/mscceY9++faxbt45wOMwJJ5xwyDOmu9PT+3p61nR3QqEQiUQitdzbs62/8IUvcPvtt3P55ZdTVVXFXXfdBfT8bOubbrqJ7373u5xyyiksWbIkq/KIiMjA08VkGRYvXswTTzzBU089xVVXXUVdXR2jR48mHA7z4osvsn379qyO09P7Fi5cyJNPPkltbS3Q+azphQsXcv/99wMQj8epr69nzJgx7N27l9raWtra2vjtb3/b6/k6nm398MMPp9b39MzsefPmsWPHDh5//HGuvfbabKtHREQGmII6w2mnnUZDQwMTJkxg3LhxXHfddaxdu5YzzzyTxx57jFNOOSWr4/T0vtNOO42vf/3rnH/++cyePZvbb78dgB//+Me8+OKLzJw5k7lz5/L2228TDof55je/yYUXXshll13W67nvuusurr76as4999xUtzr0/MxsgGuuuYYFCxakusNFRMR/9DzqQSD9edT96bLLLuO2225j4cKFPe4zmP5N9Ezc7Kiesqe6yo7qKXtH8jxqtaiHoIMHD3LyySdTUFDQa0iLiEju6WKyo7R+/Xquv/76Luvy8/N5+eWXc1SivpWWlrJx48ZcF0NERLKgoD5KM2fO5PXXX891MURE5Djlu67vXI2Zy6H0byEiknu+CupIJEJtba0Cwgecc9TW1hKJRHJdFBGRIc1XXd8VFRVUV1ezb9++XBfFV1pbW3MSmJFIhIqKigE/r4iIdMoqqM3sYuDHQBB4wDn3vYztltx+KdAM3Oic+9PhFiYcDqdufSmdqqqqmDNnTq6LISIiOdBn17eZBYH7gEuAGcC1ZjYjY7dLgGnJ183A/f1cThERkSEpmzHqs4BNzrktzrl24Akg8zmPi4BHnGcNUGpm4/q5rCIiIkNONkE9AdiRtlydXHe4+4iIiMhhymaMurtHPWVelp3NPpjZzXhd4wBtZvZWFucXGAnU5LoQg4DqKTuqp+yprrKjesre9MN9QzZBXQ1MTFuuAHYdwT4455YBywDMbO3h3u90qFJdZUf1lB3VU/ZUV9lRPWXPzNYe7nuy6fp+FZhmZlPMLA9YDDyTsc8zwGfMczZQ55zbfbiFERERka76bFE752JmdivwO7yfZz3onHvbzG5Jbl8KPIv306xNeD/PWnLsiiwiIjJ0ZPU7aufcs3hhnL5uadq8Az5/mOdedpj7D2Wqq+yonrKjesqe6io7qqfsHXZd5ex51CIiItI3X93rW0RERLrKSVCb2cVm9q6ZbTKzr+aiDIOBmW0zs/Vm9vqRXCl4PDOzB81sb/pP/MxshJk9b2bvJadluSyjH/RQT3eZ2c7k5+p1M7s0l2X0AzObaGYvmtkGM3vbzP4muV6fqQy91JU+V2nMLGJmr5jZG8l6+ofk+sP+TA1413fylqQbgY/h/azrVeBa59w7A1qQQcDMtgFnOuf0+8QMZnYe0Ih3R7zTk+vuAfY7576X/AJY5py7I5flzLUe6ukuoNE59/1cls1PkndSHOec+5OZDQPWAZ8EbkSfqS56qatr0OcqJfkMjCLnXKOZhYGXgL8BruQwP1O5aFFnc0tSkV4551YA+zNWLwIeTs4/jPc/jyGth3qSDM653R0PEnLONQAb8O6uqM9Uhl7qStIkb6ndmFwMJ1+OI/hM5SKodbvR7Dngf81sXfKubtK7MR2/309OR+e4PH52q5m9mewaH/LduenM7ARgDvAy+kz1KqOuQJ+rLswsaGavA3uB551zR/SZykVQZ3W7UQFggXPuDLynk30+2Y0pcrTuB6YCHwJ2A/fmtjj+YWbFwNPAl5xz9bkuj591U1f6XGVwzsWdcx/Cu1vnWWZ2+pEcJxdBndXtRgWcc7uS073AcrxhA+nZno6ntiWne3NcHl9yzu1J/g8kAfwcfa4ASI4jPg085pz7TXK1PlPd6K6u9LnqmXPuIFAFXMwRfKZyEdTZ3JJ0yDOzouSFGphZEXARoIeY9O4Z4Ibk/A3Af+WwLL6V8QjaK9DnquPCn18AG5xzP0jbpM9Uhp7qSp+rrsxslJmVJucLgI8Cf+YIPlM5ueFJ8rL9H9F5S9LvDHghfM7MTsRrRYN3B7nHVU+dzOxXQCXeU3v2AN8C/hN4EpgEvA9c7Zwb0hdS9VBPlXjdkw7YBvzVUL83v5mdA/wRWA8kkqvvxBt71WcqTS91dS36XKWY2Sy8i8WCeI3iJ51z/2hm5RzmZ0p3JhMREfEx3ZlMRETExxTUIiIiPqagFhER8TEFtYiIiI8pqEVERHxMQS0iIuJjCmoREREfU1CLiIj42P8HiCnsf0B36tMAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAEzCAYAAAD+XEDdAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3dd3gc1b3/8ffZ1ar3bkuyJRtb7r0BRham2HQIkAshhJAA4UcJ5CaEJDeEkJuEEKeQPCGUEAIkIcGUCyZ0jGWbZlxwlxuucpMlWbJ6Pb8/ZlUt2ysja1fS5/U8+8zuzOzqq8Oij2fmzDnGWouIiIgEJpe/CxAREZFjU1CLiIgEMAW1iIhIAFNQi4iIBDAFtYiISABTUIuIiASwEwa1MeYpY0yhMWb9MbYbY8wfjTHbjDFrjTGTur9MERGR/smXI+qngbnH2X4BMMz7uAV49IuXJSIiIuBDUFtrlwAlx9nlMuBZ6/gEiDXGDOiuAkVERPqz7rhGnQbsafO6wLtOREREvqCgbvgM08m6TsclNcbcgnN6nNDQ0MmDBg3qhh/f9zU1NeFyqd/fiaidfKN28p3ayjdqJ99t2bKlyFqb1JX3dEdQFwAZbV6nA/s629Fa+wTwBEB2drbdvHlzN/z4vi8vL4/c3Fx/lxHw1E6+UTv5Tm3lG7WT74wxu7r6nu74J9AC4Gve3t8zgDJr7f5u+FwREZF+74RH1MaYfwG5QKIxpgC4H/AAWGsfA94ALgS2AVXAjaeqWBERkf7mhEFtrb32BNstcHu3VSQiIiItuuMatYiI9AP19fUUFBRQU1PTbn1MTAz5+fl+qiowhYaGkp6ejsfj+cKfpaAWERGfFBQUEBUVRWZmJsa03vBTXl5OVFSUHysLLNZaiouLKSgoICsr6wt/nvrTi4iIT2pqakhISGgX0nI0YwwJCQlHnXk4WQpqERHxmULaN93ZTgpqERHpNSIjI/1dQo9TUIuIiAQwBbWIiPQ61lruuecexowZw9ixY3n++ecB2L9/Pzk5OUyYMIExY8awdOlSGhsb+frXv96y7+9//3s/V9816vUtIiK9zssvv8zq1atZs2YNRUVFTJ06lZycHJ577jnmzJnD//zP/9DY2EhVVRWrV69m7969rF+/HoDS0lI/V981CmoREemyB17bwMZ9RwBobGzE7XZ/4c8cNTCa+y8Z7dO+H3zwAddeey1ut5uUlBRmzZrF8uXLmTp1Kt/4xjeor6/n8ssvZ8KECQwZMoTt27dz5513ctFFF3H++ed/4Vp7kk59i4hIr+MMinm0nJwclixZQlpaGtdffz3PPvsscXFxrFmzhtzcXB555BFuuummHq72i9ERtYiIdFnbI19/DHiSk5PD448/zg033EBJSQlLlixh3rx57Nq1i7S0NG6++WYqKytZtWoVF154IcHBwVx55ZUMHTqUr3/96z1a6xeloBYRkV7niiuu4OOPP2b8+PEYY/j1r39NamoqzzzzDPPmzcPj8RAZGcmzzz7L3r17ufHGG2lqagLgwQcf9HP1XaOgFhGRXqOiogJwBhSZN28e8+bNa7f9hhtu4IYbbjjqfatWreqR+k4FXaMWEREJYApqERGRAKagFhERCWAKahERkQCmoBYREQlgCmoREZEApqAWEREJYApqERHps443f/XOnTsZM2ZMD1ZzchTUIiIiAUxBLSIivca9997Ln//855bXP/3pT3nggQc455xzmDRpEmPHjuXVV1/t8ufW1NRw4403MnbsWCZOnMiiRYsA2LBhA9OmTWPChAmMGzeOrVu3UllZyUUXXcT48eMZM2ZMy1zYp4qGEBURka578wdwYB0AYY0N4O6GOEkdCxf86ri7XHPNNdx9993cdtttAMyfP5+33nqL73znO0RHR1NUVMSMGTO49NJLMcb4/KMfeeQRANatW8emTZs4//zz2bJlC4899hh33XUX1113HXV1dTQ2NvLGG28wcOBAXn/9dQDKyspO8hf2jY6oRUSk15g4cSKFhYXs27ePNWvWEBcXx4ABA/jRj37EuHHjOPfcc9m7dy8HDx7s0ud+8MEHXH/99QCMGDGCwYMHs2XLFk4//XR++ctf8tBDD7Fr1y7CwsIYO3Ys7733Hvfeey9Lly4lJibmVPyqLXRELSIiXdfmyLe6h6e5vOqqq3jxxRc5cOAA11xzDf/85z85dOgQK1euxOPxkJmZSU1NTZc+81jzW3/lK19h+vTpvP7668yZM4cnn3yS2bNns3LlSt544w1++MMfcv755/OTn/ykO361TimoRUSkV7nmmmu4+eabKSoqYvHixcyfP5/k5GQ8Hg+LFi1i165dXf7MnJwc/vnPfzJ79my2bNnC7t27yc7OZvv27QwZ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\n",
      "text/plain": [
       "<Figure size 576x360 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_learning_curves(history, label, epochs, min_value, max_value):\n",
    "    data = {}\n",
    "    data[label] = history.history[label]\n",
    "    data['val_'+label] = history.history['val_'+label]\n",
    "    pd.DataFrame(data).plot(figsize=(8, 5))\n",
    "    plt.grid(True)\n",
    "    plt.axis([0, epochs, min_value, max_value])\n",
    "    plt.show()\n",
    "    \n",
    "plot_learning_curves(history, 'accuracy', 30, 0, 1)\n",
    "plot_learning_curves(history, 'loss', 30, 0, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "model.evaluate(test_data, test_labels, batch_size = batch_size)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
